﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using log4net;

/// <summary>
/// Descripción breve de ProcesoCRN
/// </summary>
namespace Iudicium.Procesos.CRN
{
    public class ProcesoCRN
    {
        private static readonly ILog log = LogManager.GetLogger("LogFile");
       
        public ProcesoCRN()
        {
            //
            // TODO: Agregar aquí la lógica del constructor
            //
        }

        public static int InsertProceso(Proceso objProceso, ref string codigo)
        {
            if (objProceso == null)
            {
                throw new ArgumentException("el Proceso no puede ser nulo.");
            }

            if (objProceso.EtapaProcesoId <= 0)
            {
                throw new ArgumentException("la EtapaProcesoid no puede ser menor o igual a cero");
            }


            int? ProcesoId = 0;

            ProcesoDSTableAdapters.ProcesoTableAdapter adapter =
                new ProcesoDSTableAdapters.ProcesoTableAdapter();

            adapter.Insert(ref ProcesoId,
                objProceso.NumeroExpediente,
                objProceso.MontoDemanda,
                ref codigo,
                objProceso.EtapaProcesoId,
                objProceso.FechaInicio,
                objProceso.FechaFin,
                objProceso.FechaEntregaEstimada,
                objProceso.Observacion);

            if (ProcesoId == null)
            {
                throw new Exception("La sentencia SQL se ejecuto correctamente pero no se genero la llave primaria");
            }

            return ProcesoId.Value;
        }

        public static void UpdateProceso(Proceso objProceso, string involucradosEliminados, string involucradosInsertados)
        {

            ProcesoDSTableAdapters.ProcesoTableAdapter adpater =
                   new ProcesoDSTableAdapters.ProcesoTableAdapter();

            adpater.Update(objProceso.ServicioId,objProceso.NumeroExpediente,objProceso.MontoDemanda, objProceso.FechaEntregaEstimada, objProceso.Observacion, objProceso.EtapaProcesoId, involucradosInsertados, involucradosEliminados);

        }

        public static void DeleteProceso(int ProcesoId)
        {
            if (ProcesoId <= 0)
            {
                throw new ArgumentException("ProcesoId no puede ser menor o igual que cero.");
            }
            ProcesoDSTableAdapters.ProcesoTableAdapter adpater =
                  new ProcesoDSTableAdapters.ProcesoTableAdapter();

            adpater.Delete(ProcesoId);

        }

        public static Proceso GetProcesoById(int ProcesoId)
        {
            if (ProcesoId <= 0)
            {
                throw new ArgumentException("ProcesoId no puede ser menor o igual que cero.");
            }

            ProcesoDSTableAdapters.ProcesoTableAdapter adpater =
                new ProcesoDSTableAdapters.ProcesoTableAdapter();

            ProcesoDS.ProcesoDataTable tabla =
                adpater.GetProcesoById(ProcesoId);

            if (tabla == null || tabla.Rows.Count == 0)
            {
                throw new Exception("No se pudo obtener " + ProcesoId + " de la base de datos");
            }
            return ConstruirProceso(tabla[0]);
        }

        public static List<Proceso> GetProcesoBySearch(string parametro, int usuarioId, bool tienePermiso)
        {
            if (usuarioId <= 0)
            {
                throw new Exception("UsuarioId  no puede ser menor o igual que cero.");
            }
            List<Proceso> lista = new List<Proceso>();

            ProcesoDSTableAdapters.ProcesoTableAdapter adpater =
                  new ProcesoDSTableAdapters.ProcesoTableAdapter();

            ProcesoDS.ProcesoDataTable tabla =
                adpater.GetProcesoBySearch(parametro, tienePermiso, usuarioId);

            if (tabla == null)
            {
                throw new Exception("No se pudo obtener resultados de la busqueda con el parametro " +
                    parametro +
                    " de la base de datos");
            }

            foreach (ProcesoDS.ProcesoRow row in tabla)
            {
                Proceso obj = ConstruirProceso(row);
                if (obj != null)
                    lista.Add(obj);
            }
            return lista;
        }

        public static Proceso ConstruirProceso(ProcesoDS.ProcesoRow row)
        {
            if (row == null)
                return null;
            Proceso objProceso = new Proceso(row.ProcesoId,
                    row.codigoServicio,
                    row.fechaInicio,
                    row.IsfechaFinNull() ? DateTime.MinValue : row.fechaFin,
                    row.fechaEntregaEstimada,
                    row.observacion,
                    row.estado,
                    row.etapaProcesoId,
                    row.numeroExpediente,
                    row.montoDemanda,
                    row.demandados,
                    row.demandantes,
                    row.responsables,
                    row.etapa,
                    row.tipo);
            if (!row.IsfechaEntregaNull())
                objProceso.FechaEntrega = row.fechaEntrega;
            objProceso.EntregadoA = row.IsentregadoANull() ? "" : row.entregadoA;
            objProceso.ObservacionEntrega = row.IsobservacionEntregaNull() ? "" : row.observacionEntrega;
            return objProceso;

        }
    }
}
